//package mpxj;
//
//import java.io.BufferedInputStream;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.ArrayList;
//import java.util.List;
//
//import net.sf.mpxj.Duration;
//import net.sf.mpxj.ProjectFile;
//import net.sf.mpxj.Resource;
//import net.sf.mpxj.ResourceAssignment;
//import net.sf.mpxj.Task;
//import net.sf.mpxj.TimeUnit;
//import net.sf.mpxj.mpp.MPPReader;
//import net.sf.mpxj.mpx.MPXReader;
//import net.sf.mpxj.mspdi.MSPDIReader;
//
//import com.jacob.activeX.ActiveXComponent;
//import com.jacob.com.Dispatch;
//import com.jacob.com.Variant;
//
//public class MppUtil {
//
//	/** 顶级的父类Id **/
//	private static final int TOP_PARENTID = 0;
//
//	/** 顶级的层次 **/
//	private static final int TOP_LEVEL=1;
//	
//	/** 生成mpp文件存放的路径 **/
//	private static final String FILE_PATH="C:/test.mpp";
//	/**
//	 * 获取任务列表
//	 * 
//	 * @param file
//	 *            项目文件
//	 * @return
//	 * @throws FileNotFoundException 
//	 */
//	public static List<TaskBean> getTaskList(String fileName) throws FileNotFoundException {
//		ProjectFile file=readProject(fileName);
//		List<Task> msProjs = file.getChildTasks();
//		List<TaskBean> taskBeanList = new ArrayList<TaskBean>();
//		if (!msProjs.isEmpty()) {
//			Task msProj = (Task) msProjs.get(TOP_PARENTID);
//			taskBeanList = listHierarchy(msProj, TOP_PARENTID);
//		}
//		return taskBeanList;
//	}
//	
//	/**
//	 * 创建mpp文件
//	 * @param taskBeanList 任务列表
//	 * @throws Exception 
//	 */
//	public static void createMppFile(List<TaskBean> taskBeanList) throws Exception{
//		File file=new File(FILE_PATH);
//		if(file.exists()){
//			file.delete();
//		}
//		if(taskBeanList!=null && taskBeanList.size()>0){
//			ActiveXComponent app=null;
//			try{
//				app = new ActiveXComponent("MSProject.Application");
//				app.setProperty("Visible", new Variant(false));
//				Dispatch projects = app.getProperty("Projects").toDispatch();
//				Dispatch project=Dispatch.call(projects, "Add").toDispatch();//添加一个项目
//				Dispatch tasks=Dispatch.get(project, "Tasks").toDispatch();//生成一个task集合 
//				//生成Task
//				TaskBean topTaskBean=getTopTaskBean(taskBeanList);
//				createTreeTable(tasks, topTaskBean, TOP_LEVEL, taskBeanList);
//				//另存为
//				Dispatch.invoke(project, "SaveAs", Dispatch.Method, new Object[] { FILE_PATH, new Variant(0) }, new int[1]);
//			}finally{
//				if(app!=null)
//					app.invoke("Quit", new Variant[] {});
//			}
//		}
//	}
//	
//	/**
//	 * 创建树形结构
//	 * @param tasks   任务集合
//	 * @param taskBean 任务Bean
//	 * @param level    层次
//	 * @param taskBeanList 任务列表
//	 */
//	private static void createTreeTable(Dispatch tasks,TaskBean taskBean,int level,List<TaskBean> taskBeanList){
//		Dispatch task=Dispatch.call(tasks, "Add").toDispatch();
//		setTaskValue(task, taskBean, level);
//		List<TaskBean> sonTaskBeanList=getSonTaskBean(taskBeanList, taskBean);
//		if(!sonTaskBeanList.isEmpty()){
//			for(TaskBean sonTaskBean:sonTaskBeanList){
//				createTreeTable(tasks, sonTaskBean, level+1, taskBeanList);
//			}
//		}
//	}
//	
//	/**
//	 * 获取所有的子任务
//	 * @param taskBeanList  任务列表
//	 * @param parentTaskBean  父级任务Bean
//	 * @return
//	 */
//	private static List<TaskBean> getSonTaskBean(List<TaskBean> taskBeanList,TaskBean parentTaskBean){
//		List<TaskBean> sonTaskBeanList=new ArrayList<TaskBean>();
//		for(TaskBean taskBean:taskBeanList){
//			if(taskBean.getParentId()==parentTaskBean.getId()){
//				sonTaskBeanList.add(taskBean);
//			}
//		}
//		return sonTaskBeanList;
//	}
//	
//	/**
//	 * 获取顶级任务
//	 * @param taskBeanList 任务列表
//	 * @return
//	 */
//	private static TaskBean getTopTaskBean(List<TaskBean> taskBeanList){
//		for(TaskBean taskBean:taskBeanList){
//			if(taskBean.getParentId()==TOP_PARENTID)
//				return taskBean;
//		}
//		return null;
//	}
//	
//	/**
//	 * 给任务设置属性
//	 * @param task  任务指针
//	 * @param taskBean  任务Bean
//	 * @param level    层次
//	 */
//	private static void setTaskValue(Dispatch task,TaskBean taskBean,int level){
//		Dispatch.put(task, "Name", taskBean.getTaskName());
////		Dispatch.put(task, "Duration",Duration.getInstance(5, TimeUnit.DAYS));
//		Dispatch.put(task, "Start", taskBean.getStartTime());
//		Dispatch.put(task, "Finish", taskBean.getFinishTime());
////		Dispatch.put(task, "Duration",taskBean.getDuration());
////		Dispatch.put(task, "PercentageComplete",NumberUtility.getDouble(taskBean.getPercentageComplete()));
//		Dispatch.put(task, "OutlineLevel", level);
//		Dispatch.put(task, "ResourceNames", taskBean.getResource());
//	}
//
//	/**
//	 * 读取项目文件
//	 * 
//	 * @param fileName
//	 *            文件名 绝对路径
//	 * @return
//	 * @throws FileNotFoundException
//	 */
//	private static ProjectFile readProject(String fileName)
//			throws FileNotFoundException {
//		InputStream is = new BufferedInputStream(new FileInputStream(fileName));
//		is.mark(0);// 下面需要重复使用输入流，所以重新包装并设置重置标记
//
//		ProjectFile mpx = null;
//		try {
//			mpx = new MPXReader().read(is);
//		} catch (Exception ex) {
//			try {
//				is.reset();// 重置
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//		}
//
//		if (mpx == null) {
//			try {
//				mpx = new MPPReader().read(is);
//			} catch (Exception ex) {
//				try {
//					is.reset();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//		}
//
//		if (mpx == null) {
//			try {
//				mpx = new MSPDIReader().read(is);
//			} catch (Exception ex) {
//			}
//		}
//		return mpx;
//	}
//
//	/**
//	 * 获取任务的子任务
//	 * 
//	 * @param msProj
//	 *            任务
//	 * @param parentId
//	 *            父任务Id
//	 * @return
//	 */
//	private static List<TaskBean> listHierarchy(Task msProj, int parentId) {
//		List<Task> childTasks = msProj.getChildTasks();
//		List<TaskBean> taskBeanList = new ArrayList<TaskBean>();
//		TaskBean taskBean = null;
//		if (!childTasks.isEmpty()) {
//			for (Task task : childTasks) {
//				taskBeanList.add(getTaskBean(taskBean, task, parentId));
//				taskBeanList.addAll(listHierarchy(task, task.getID()));
//			}
//		}
//		return taskBeanList;
//	}
//
//	/**
//	 * 获取任务的具体字段
//	 * 
//	 * @param taskBean
//	 *            任务Bean
//	 * @param task
//	 *            任务
//	 * @param parentId
//	 *            父类Id
//	 * @return
//	 */
//	private static TaskBean getTaskBean(TaskBean taskBean, Task task,
//			int parentId) {
//		taskBean = new TaskBean();
//		taskBean.setId(task.getID());
//		taskBean.setParentId(parentId);
//		taskBean.setTaskName(task.getName());
//		taskBean.setDuration(task.getDuration().getDuration());
//		taskBean.setStartTime(task.getStart());
//		taskBean.setFinishTime(task.getFinish());
//		taskBean.setPercentageComplete(task.getPercentageComplete().doubleValue());
//		taskBean.setResource(listTaskRes(task));
//		return taskBean;
//	}
//
//	/**
//	 * 获取任务中的资源
//	 * 
//	 * @param task
//	 *            任务
//	 * @return
//	 */
//	private static String listTaskRes(Task task) {
//		StringBuffer buf = new StringBuffer();
//		List<ResourceAssignment> assignments = task.getResourceAssignments();//获取任务资源列表
//		if(assignments!=null && !assignments.isEmpty()){
//			ResourceAssignment assignment = (ResourceAssignment) assignments.get(0);//只获取第一个资源
//			Resource resource = assignment.getResource();
//			if(resource!=null)
//				buf.append(resource.getName());
//		}
//		return buf.toString();
//	}
//	
//	public static void main(String[] args) throws Exception {
//		List<TaskBean> taskBeanList = MppUtil.getTaskList("项目实施计划.mpp");
//		System.out.println(taskBeanList.size());
//		
//		createMppFile(taskBeanList);
//	}
//}
